package cn.cj.erp.bo.system;

import cn.cj.erp.common.SearchParam;
import cn.cj.erp.common.annotation.Search;
import cn.cj.erp.common.enums.SearchType;
import cn.cj.erp.common.enums.MenuTypeEnum;
import cn.cj.erp.common.enums.StatusEnum;
import cn.cj.erp.common.enums.YesNoEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 菜单管理
 *
 * @author chenjian
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class SysMenuBo extends SearchParam {
    /** 菜单ID */
    @JsonSerialize(using = ToStringSerializer.class)
    private Long menuId;

    /** 菜单编码 */
    @NotBlank(message = "菜单编码不能为空")
    @Search(type = SearchType.LIKE)
    private String menuCode;

    /** 菜单名称 */
    @NotBlank(message = "菜单名称不能为空")
    @Search(type = SearchType.LIKE)
    private String menuName;

    /** 菜单名称或编码，仅搜索用 */
    @Search(type = SearchType.APPLY, apply =
            "(menu_name like concat('%', {}, '%') OR menu_code like concat('%', {}, '%'))")
    private String menuCodeOrName;

    /** 父菜单ID，一级菜单为0 */
    @NotNull(message = "父菜单不能为空")
    @Search(type = SearchType.EQ)
    private Long parentId;

    /** 父菜单名称 */
    private String parentName;

    /** 显示顺序 */
    @NotNull(message = "显示顺序不能为空")
    private Integer orderNum;

    /** 路由地址 */
    private String path;

    /** 组件路径 */
    private String component;

    /** 路由参数 */
    private String query;

    /** 是否为外链（1-是 0-否）YesNo */
    private YesNoEnum frame;

    /** 是否缓存（1-是 0-否） YesNo*/
    private YesNoEnum cache;

    /** 类型（M目录 C菜单 F按钮）MenuType */
    @Search(type = SearchType.EQ)
    private MenuTypeEnum menuType;

    /** 是否显示（1是 0否）*/
    private YesNoEnum visible;

    /** 菜单状态 */
    @Search(type = SearchType.EQ)
    private StatusEnum status;

    /** 权限字符串(多个用逗号分隔，如：system:user:list,system:user:create) */
    private String perms;

    /** 菜单图标 */
    private String icon;

    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;

    /** 修改时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date modifyTime;

    /** 用户id */
    @Search(type = SearchType.APPLY, apply =
            "menu_id IN (SELECT rm.menu_id FROM sys_role_menu rm JOIN sys_user_role ur ON rm.`role_id`=ur.`role_id` WHERE ur.user_id={})")
    private Long userId;

    /** 菜单类型列表(仅查询) */
    @Search(type = SearchType.IN, fieldName = "menu_type")
    private List<MenuTypeEnum> menuTypes;

    /** 根菜单id */
    private Long treeRootId;

    /** 子菜单 */
    private List<SysMenuBo> children = new ArrayList<>();
}
